package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.imut.lagain.entity.FinalPassword;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 最终密码服务接口
 * 提供密码管理相关的业务逻辑
 */
public interface IFinalPasswordService {
    
    /**
     * 获取当前激活的密码
     * @return 当前激活的密码
     */
    FinalPassword getCurrentActivePassword();
    
    /**
     * 获取所有激活的密码
     * @return 激活的密码列表
     */
    List<FinalPassword> getAllActivePasswords();
    
    /**
     * 根据密码值查询
     * @param passwordValue 密码值
     * @return 密码信息
     */
    FinalPassword getPasswordByValue(String passwordValue);
    
    /**
     * 根据激活状态分页查询
     * @param isActive 是否激活
     * @param page 分页参数
     * @return 密码分页列表
     */
    IPage<FinalPassword> getPasswordsByActiveStatus(Boolean isActive, Page<FinalPassword> page);
    
    /**
     * 根据创建时间范围查询
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 分页参数
     * @return 密码分页列表
     */
    IPage<FinalPassword> getPasswordsByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime, Page<FinalPassword> page);
    
    /**
     * 分页查询所有密码
     * @param page 分页参数
     * @return 密码分页列表
     */
    IPage<FinalPassword> page(Page<FinalPassword> page);
    
    /**
     * 统计激活密码数量
     * @return 激活密码数量
     */
    Long countActivePasswords();
    
    /**
     * 统计总密码数量
     * @return 总密码数量
     */
    Long countTotalPasswords();
    
    /**
     * 创建新密码
     * @param passwordValue 密码值
     * @param description 描述
     * @param isActive 是否激活
     * @return 创建的密码
     */
    FinalPassword createPassword(String passwordValue, String description, Boolean isActive);
    
    /**
     * 更新密码激活状态
     * @param passwordId 密码ID
     * @param isActive 是否激活
     * @return 是否更新成功
     */
    boolean updatePasswordActiveStatus(Long passwordId, Boolean isActive);
    
    /**
     * 停用所有密码
     * @return 停用的密码数量
     */
    int deactivateAllPasswords();
    
    /**
     * 根据描述搜索密码
     * @param description 描述
     * @param page 分页参数
     * @return 密码分页列表
     */
    IPage<FinalPassword> searchPasswordsByDescription(String description, Page<FinalPassword> page);
    
    /**
     * 检查密码是否存在
     * @param passwordValue 密码值
     * @return 是否存在
     */
    boolean passwordExists(String passwordValue);
    
    /**
     * 获取最新创建的密码
     * @return 最新创建的密码
     */
    FinalPassword getLatestCreatedPassword();
    
    /**
     * 获取最新更新的密码
     * @return 最新更新的密码
     */
    FinalPassword getLatestUpdatedPassword();
    
    /**
     * 验证密码
     * @param rawPassword 原始密码
     * @param encodedPassword 编码后的密码
     * @return 是否匹配
     */
    boolean verifyPassword(String rawPassword, String encodedPassword);
    
    /**
     * 验证当前密码
     * @param rawPassword 原始密码
     * @return 是否匹配
     */
    boolean verifyCurrentPassword(String rawPassword);
    
    /**
     * 验证密码格式
     * @param passwordValue 密码值
     * @return 是否有效
     */
    boolean validatePassword(String passwordValue);
    
    /**
     * 独占激活密码
     * @param passwordId 密码ID
     * @return 是否成功
     */
    boolean activatePasswordExclusively(Long passwordId);
    
    /**
     * 生成随机密码
     * @param length 密码长度
     * @return 随机密码
     */
    String generateRandomPassword(int length);
    
    /**
     * 生成UUID密码
     * @return UUID密码
     */
    String generateUUIDPassword();
    
    /**
     * 验证当前密码
     * @param password 密码
     * @return 是否有效
     */
    boolean validateCurrentPassword(String password);
    
    /**
     * 更新密码
     * @param password 密码对象
     * @return 是否更新成功
     */
    boolean updatePassword(FinalPassword password);
    
    /**
     * 删除密码
     * @param passwordId 密码ID
     * @return 是否删除成功
     */
    boolean deletePassword(Long passwordId);
    
    /**
     * 生成UUID密码
     * @return 生成的密码对象
     */
    FinalPassword generateUuidPassword();
}
